2025-09-05

Ejercicio 1: Vectores

Consigna

Considerar los siguientes vectores:

  • \(\vec{u}=(4,-2)\)
  • \(\vec{v}=(2,1)\)

Tareas:

  1. Calcular la proyección de \(\vec{u}\) sobre \(\vec{v}\)
  2. Calcular la proyección de \(\vec{v}\) sobre \(\vec{u}\)

Resolución - Parte A

Resolución - Parte B

Resolución y verificación en R

u <- c(4, -2)
v <- c(2, 1)
# Proyección de u sobre v
proj_u_on_v <- (sum(u * v) / sum(v * v)) * v
# Proyección de v sobre u
proj_v_on_u <- (sum(v * u) / sum(u * u)) * u
cat("Proyección de u sobre v:\n"); print(proj_u_on_v)
## Proyección de u sobre v:
## [1] 2.4 1.2
cat("Proyección de v sobre u:\n"); print(proj_v_on_u)
## Proyección de v sobre u:
## [1]  1.2 -0.6

Ejercicio 2: Matrices

Consigna - Parte 1

Considerar la siguiente matriz:

\[A = \begin{pmatrix} 185 & -80 \\ -80 & 65 \end{pmatrix}\]

Tareas:

  1. Calcular los autovalores y autovectores
  2. Expresar \(A\) en su forma diagonalizada (\(A=V\times D\times V^{-1}\))
  3. Dividir cada columna de V por su norma, obteniendo la matriz \(V_o\). Comprobar que \(A=V_o\times D\times V_o^T\). ¿Cómo haría para invertir la matriz \(A\)?

Resolución - Parte A (1/2)

Resolución - Parte A (2/2)

Verificación en R - Autovalores y Autovectores

A <- matrix(c(185, -80, -80, 65), nrow=2, byrow=TRUE)
eigen_A <- eigen(A)
cat("Autovalores:\n"); print(eigen_A$values)
## Autovalores:
## [1] 225  25
cat("Autovectores:\n"); print(eigen_A$vectors)  #pq no me da -2 1 y 1 -2?
## Autovectores:
##            [,1]       [,2]
## [1,] -0.8944272 -0.4472136
## [2,]  0.4472136 -0.8944272

Resolución - Parte B

Verificaación en R - A diagonalizada

V <- eigen_A$vectors
D <- diag(eigen_A$values)
A_reconstructed <- V %*% D %*% solve(V)
cat("A reconstruida (V * D * V^-1):\n"); print(A_reconstructed)
## A reconstruida (V * D * V^-1):
##      [,1] [,2]
## [1,]  185  -80
## [2,]  -80   65
cat("Matriz A original:\n"); print(A)
## Matriz A original:
##      [,1] [,2]
## [1,]  185  -80
## [2,]  -80   65

Resolución - C

Consigna - Parte 2

Considerar la matriz \(B= \begin{pmatrix} 10 & -7 & 6 \\ -5 & 6 &2 \end{pmatrix}\)

Tareas:

  1. Calcular los autovalores y autovectores de la matriz \(B\times B^T\). Obtener una matriz \(U\) disponiendo los autovectores como columnas y dividiendo por su norma.

  2. Calcular los autovalores y autovectores de la matriz \(B^T\times B\) (Ayuda: los autovalores son los mismos que los de \(B\times B^T\), al que se le agrega un cero). Obtener una matriz \(V\) disponiendo los autovectores como columnas y dividiendo por su norma.

  3. Descomponer la matriz \(B\) según sus valores singulares (\(B=U\times D\times V^T\))

Resolución - Parte A (1/2)

Resolución - Parte A (2/2)

Verificación en R - Parte A

B <- matrix(c(10, -7, 6, -5, 6, 2), nrow=2, byrow=TRUE)
BBt <- B %*% t(B)
eigen_BBt <- eigen(BBt)
cat("Autovalores de B*B^T:\n"); print(eigen_BBt$values)
## Autovalores de B*B^T:
## [1] 225  25
cat("Autovectores de B*B^T:\n"); print(eigen_BBt$vectors)
## Autovectores de B*B^T:
##            [,1]       [,2]
## [1,] -0.8944272 -0.4472136
## [2,]  0.4472136 -0.8944272
U <- apply(eigen_BBt$vectors, 2, function(x) x / sqrt(sum(x^2)))
cat("Matriz U (autovectores normalizados):\n"); print(U)
## Matriz U (autovectores normalizados):
##            [,1]       [,2]
## [1,] -0.8944272 -0.4472136
## [2,]  0.4472136 -0.8944272

Resolución - Parte B (1/3)

Resolución - Parte B (2/3)

Resolución - Parte B (3/3)

Resolución - Parte C

Ejercicio 3: Vectores Aleatorios

Consigna

Considerar los siguientes datos:

\[\begin{array}{cc} x & y \\ \hline 5820 & 5880\\ 6030 &5970\\ 5850 & 6060\\ 6120 & 5940\\ 6240 & 6000\\ 6000 & 6240\\ \end{array}\]

Tareas

  1. Calcular el vector de medias, la matriz de covarianza y la matriz de correlación para estos datos.

  2. Calcular la distancia de Mahalanobis y la densidad normal multivariada de los primeros 3 datos utilizando el vector de medias \(\mu=(6000,6000)\) y matriz de covarianza \(\Sigma=\begin{pmatrix} 185 & -80 \\ -80 & 65 \end{pmatrix}\). ¿Qué observa?

Resolución - Parte A (1/3)

Resolución - Parte A (2/3)

Verificación en R - Parte A

## Vector de medias:
##    x    y 
## 6010 6015
## Matriz de covarianza:
##       x     y
## x 25440   720
## y   720 15750
## Matriz de correlación:
##            x          y
## x 1.00000000 0.03596944
## y 0.03596944 1.00000000

Resolución - Parte B

Verificación en R - Parte B

## Distancias de Mahalanobis para los primeros 3 datos:
##         1         2         3 
## 38.241339  3.794733 11.063453
## Densidades normales multivariadas para los primeros 3 datos:
##             1             2             3 
## 5.899144e-321  1.584304e-06  5.596759e-30

Resolución - Parte B2 (3/3)

Ejercicio 5: Bases de Datos

Consigna General

Considerar las bases df_a.csv, df_b.csv y df_c.csv

Tareas:

  1. Completar el código para hacer un scatterplot de ambas variables en cada base
  2. En cada base, calcular el vector de medias, la matriz de covarianza y la matriz de correlación
  3. Completar el código para hacer gráficos de densidad conjunta utilizando contornos y heatmaps
  4. Completar el código para hacer histogramas y qq-plots de cada variable
  5. ¿Cuál de las bases tiene una distribución que se asemeja a una normal multivariada?

Scatterplot - Código Incompleto

scatGG=function(Base,x.Ch,y.Ch){
  GG=_____ %>% 
    ggplot(aes(x=get(______),y=get(____)))+
    geom_point(alpha=0.5)
  return(GG)
}

textGG=function(GG,tL,xL,yL,tS,aTS,atS){
  GG=GG+
    labs(title = ______)+
    xlab(___)+
    ylab(____)+
    theme_bw()+
    theme(title = element_text(size=_____,face = "bold"),
          axis.title = element_text(size=____,face = "plain"),
          axis.text = element_text(size=___),
          plot.title = element_text(hjust=0.5))
  return(GG)
}

Scatterplot - Código Completo

scatGG=function(Base,x.Ch,y.Ch){
  GG=Base %>%                          # ← COMPLETO: Base
    ggplot(aes(x=get(x.Ch),y=get(y.Ch)))+  # ← COMPLETO: x.Ch, y.Ch
    geom_point(alpha=0.5)
  return(GG)
}

textGG=function(GG,tL,xL,yL,tS,aTS,atS){
  GG=GG+
    labs(title = tL)+                  # ← COMPLETO: tL
    xlab(xL)+                          # ← COMPLETO: xL
    ylab(yL)+                          # ← COMPLETO: yL
    theme_bw()+
    theme(title = element_text(size=tS,face = "bold"),      # ← COMPLETO: tS
          axis.title = element_text(size=aTS,face = "plain"), # ← COMPLETO: aTS
          axis.text = element_text(size=atS),                 # ← COMPLETO: atS
          plot.title = element_text(hjust=0.5))
  return(GG)
}

Gráfico df_a

# Scatterplot df_a
g_a <- scatGG(df_a, "x", "y")
g_a <- textGG(g_a, "Scatter df_a", "x", "y", 14, 10, 8)
print(g_a)

Gráfico df_b

# Scatterplot df_b
g_b <- scatGG(df_b, "x", "y")
g_b <- textGG(g_b, "Scatter df_b", "x", "y", 14, 10, 8)
print(g_b)

Gráfico df_c

# Scatterplot df_c
g_c <- scatGG(df_c, "x", "y")
g_c <- textGG(g_c, "Scatter df_c", "x", "y", 14, 10, 8)
print(g_c)

Vectores de Medias

## [1] "medias_a <- colMeans(df_a); medias_b <- colMeans(df_b); medias_c <- colMeans(df_c)"
## Medias df_a:
##        x        y 
##  999.689 1500.017
## Medias df_b:
##        x        y 
## 1000.067 1500.272
## Medias df_c:
##        x        y 
## 1000.451 1500.073

Matrices de Covarianza

# Matrices de covarianza
cov_a <- cov(df_a); cov_b <- cov(df_b); cov_c <- cov(df_c)

cat("Covarianza df_a:\n"); print(round(cov_a, 3))
## Covarianza df_a:
##         x       y
## x  36.633 -19.446
## y -19.446  15.814
cat("Covarianza df_b:\n"); print(round(cov_b, 3))
## Covarianza df_b:
##          x        y
## x 1252.245 1193.867
## y 1193.867 1209.422

Matrices de Correlación

## [1] "cor_a <- cor(df_a); cor_b <- cor(df_b); cor_c <- cor(df_c)"
## Correlación df_a:
##        x      y
## x  1.000 -0.808
## y -0.808  1.000
## Correlación df_b:
##      x    y
## x 1.00 0.97
## y 0.97 1.00
## Correlación df_c:
##       x     y
## x 1.000 0.551
## y 0.551 1.000

Densidad Conjunta - Código Incompleto

dCont2DGG=function(Base,x.Ch,y.Ch){
  GG=_____ %>% 
      ggplot(aes(x=get(____),y=get(____)))+
      stat_density_2d(aes(color = ..level..)) +
      scale_color_viridis_c()
  return(GG)
}

dFill2DGG=function(Base,x.Ch,y.Ch){
    GG=Base %>% 
      ggplot(aes(x=get(_____),y=get(_____)))+
      stat_density_2d(aes(fill = ..density..), 
                     geom = "raster", contour = FALSE) +
      scale_fill_viridis_c()
  return(GG)
}

Densidad Conjunta - Código Completo

dCont2DGG=function(Base,x.Ch,y.Ch){
  GG=Base %>%                               # ← COMPLETO: Base
    ggplot(aes(x=get(x.Ch),y=get(y.Ch)))+   # ← COMPLETO: x.Ch, y.Ch
    stat_density_2d(aes(color = ..level..)) +
    scale_color_viridis_c()
  return(GG)
}

dFill2DGG=function(Base,x.Ch,y.Ch){
  GG=Base %>%                               # ← COMPLETO: Base  
    ggplot(aes(x=get(x.Ch),y=get(y.Ch)))+   # ← COMPLETO: x.Ch, y.Ch
    stat_density_2d(aes(fill = ..density..), geom = "raster", contour = FALSE) +
    scale_fill_viridis_c()
  return(GG)
}

Gráfico de Contornos df_a

# Densidad con contornos df_a
g2_a <- dCont2DGG(df_a, "x", "y")
g2_a <- textGG(g2_a, "Densidad Contornos df_a", "x", "y", 14, 10, 8)
print(g2_a)

Gráfico Heatmap df_a

# Densidad con heatmap df_a
g3_a <- dFill2DGG(df_a, "x", "y")
g3_a <- textGG(g3_a, "Densidad Heatmap df_a", "x", "y", 14, 10, 8)
print(g3_a)

Gráfico de Contornos df_b

# Densidad con contornos df_b
g2_b <- dCont2DGG(df_b, "x", "y")
g2_b <- textGG(g2_b, "Densidad Contornos df_b", "x", "y", 14, 10, 8)
print(g2_b)

Gráfico Heatmap df_b

# Densidad con heatmap df_b
g3_b <- dFill2DGG(df_b, "x", "y")
g3_b <- textGG(g3_b, "Densidad Heatmap df_b", "x", "y", 14, 10, 8)
print(g3_b)

Gráfico de Contornos df_c

# Densidad con contornos df_c
g2_c <- dCont2DGG(df_c, "x", "y")
g2_c <- textGG(g2_c, "Densidad Contornos df_c", "x", "y", 14, 10, 8)
print(g2_c)

Gráfico Heatmap df_c

# Densidad con heatmap df_c
g3_c <- dFill2DGG(df_c, "x", "y")
g3_c <- textGG(g3_c, "Densidad Heatmap df_c", "x", "y", 14, 10, 8)
print(g3_c)

Histogramas y QQ-plots - Código Incompleto

GG_qqNorm=function(Base,y.Ch){
  my=mean(Base[,_____])
  sy=sd(_____[,____])
  GG=Base %>% 
    ggplot(aes(sample=get(y.Ch)))+
    stat_qq(distribution = qnorm,dparams = list(mean=____,sd=____))+
    stat_qq_line(distribution = qnorm,dparams = list(mean=____,sd=___),
                linetype="dashed",color="red")
  return(GG)
}

histGG_Norm=function(Base,x.Ch){
  mx=mean(____[,_____])
  sx=_____(Base[,x.Ch])
  xs=seq(mx-2.5*sx,mx+2.5*sx,length.out=500)
  ds=dnorm(xs,mx,sx)
  df_d=data.frame(x=xs,d=ds)
  GG=Base %>% 
    ggplot(aes(x=get(_____)))+
    geom_histogram(mapping=aes(y=..density..),color="blue",fill="white")+
    geom_line(data = _____,mapping = aes(x=x,y=d),color="red")
  return(GG)
}

Histogramas y QQ-plots - Código Completo

GG_qqNorm=function(Base,y.Ch){
  my=mean(Base[,y.Ch])              # ← COMPLETO: y.Ch
  sy=sd(Base[,y.Ch])                # ← COMPLETO: Base[,y.Ch]
  GG=Base %>%
    ggplot(aes(sample=get(y.Ch)))+
    stat_qq(distribution = qnorm,dparams = list(mean=my,sd=sy))+      # ← COMPLETO: my, sy
    stat_qq_line(distribution = qnorm,dparams = list(mean=my,sd=sy),  # ← COMPLETO: my, sy
                linetype="dashed",color="red")
  return(GG)
}

histGG_Norm=function(Base,x.Ch){
  mx=mean(Base[,x.Ch])              # ← COMPLETO: Base[,x.Ch]
  sx=sd(Base[,x.Ch])                # ← COMPLETO: sd
  xs=seq(mx-2.5*sx,mx+2.5*sx,length.out=500)
  ds=dnorm(xs,mx,sx)
  df_d=data.frame(x=xs,d=ds)
  GG=Base %>%
    ggplot(aes(x=get(x.Ch)))+       # ← COMPLETO: x.Ch
    geom_histogram(mapping=aes(y=..density..),color="blue",fill="white")+
    geom_line(data = df_d,mapping = aes(x=x,y=d),color="red")  # ← COMPLETO: df_d
  return(GG)
}

QQ-plots df_a

# QQ-plots para x e y en df_a
g4_a_x <- GG_qqNorm(df_a, "x")
g4_a_x <- textGG(g4_a_x, "QQ-Plot df_a x", "Teóricos", "Muestrales", 12, 9, 7)

g4_a_y <- GG_qqNorm(df_a, "y")
g4_a_y <- textGG(g4_a_y, "QQ-Plot df_a y", "Teóricos", "Muestrales", 12, 9, 7)

ggarrange(g4_a_x, g4_a_y, ncol=2, nrow=1)

Histogramas df_a

# Histogramas para x e y en df_a
g5_a_x <- histGG_Norm(df_a, "x")
g5_a_x <- textGG(g5_a_x, "Histograma df_a x", "x", "Densidad", 12, 9, 7)

g5_a_y <- histGG_Norm(df_a, "y")
g5_a_y <- textGG(g5_a_y, "Histograma df_a y", "y", "Densidad", 12, 9, 7)

ggarrange(g5_a_x, g5_a_y, ncol=2, nrow=1)

QQ-plots df_b

# QQ-plots para x e y en df_b
g4_b_x <- GG_qqNorm(df_b, "x")
g4_b_x <- textGG(g4_b_x, "QQ-Plot df_b x", "Teóricos", "Muestrales", 12, 9, 7)

g4_b_y <- GG_qqNorm(df_b, "y")
g4_b_y <- textGG(g4_b_y, "QQ-Plot df_b y", "Teóricos", "Muestrales", 12, 9, 7)

ggarrange(g4_b_x, g4_b_y, ncol=2, nrow=1)

Histogramas df_b

# Histogramas para x e y en df_b
g5_b_x <- histGG_Norm(df_b, "x")
g5_b_x <- textGG(g5_b_x, "Histograma df_b x", "x", "Densidad", 12, 9, 7)

g5_b_y <- histGG_Norm(df_b, "y")
g5_b_y <- textGG(g5_b_y, "Histograma df_b y", "y", "Densidad", 12, 9, 7)

ggarrange(g5_b_x, g5_b_y, ncol=2, nrow=1)

QQ-plots df_c

# QQ-plots para x e y en df_c
g4_c_x <- GG_qqNorm(df_c, "x")
g4_c_x <- textGG(g4_c_x, "QQ-Plot df_c x", "Teóricos", "Muestrales", 12, 9, 7)

g4_c_y <- GG_qqNorm(df_c, "y")
g4_c_y <- textGG(g4_c_y, "QQ-Plot df_c y", "Teóricos", "Muestrales", 12, 9, 7)

ggarrange(g4_c_x, g4_c_y, ncol=2, nrow=1)

Histogramas df_c

# Histogramas para x e y en df_c
g5_c_x <- histGG_Norm(df_c, "x")
g5_c_x <- textGG(g5_c_x, "Histograma df_c x", "x", "Densidad", 12, 9, 7)

g5_c_y <- histGG_Norm(df_c, "y")
g5_c_y <- textGG(g5_c_y, "Histograma df_c y", "y", "Densidad", 12, 9, 7)

ggarrange(g5_c_x, g5_c_y, ncol=2, nrow=1)

Análisis de Normalidad

# Análisis comparativo de las tres bases
cat("Correlaciones:\n")
## Correlaciones:
cat("• df_a:", round(cor_a[1,2], 3), "\n")
## • df_a: -0.808
cat("• df_b:", round(cor_b[1,2], 3), "\n") 
## • df_b: 0.97
cat("• df_c:", round(cor_c[1,2], 3), "\n\n")
## • df_c: 0.551

Conclusión (1/2)

¿Cuál de las bases tiene una distribución que se asemeja a una normal multivariada?

A partir de los análisis y gráficos realizados en esta parte, se puede notar que:

df_a:

  1. Contornos elípticos pero algo sesgados
  2. Correlación fuerte negativa (-0.808)
  3. Histogramas y QQ-plots muestran desviaciones en colas
  4. Se acerca a la normal, pero no perfectamente

df_b:

  1. Contorno muy comprimido y alargado
  2. Heatmap muy concentrado en casi una diagonal fina
  3. Correlación altísima (0.97)
  4. QQ-plots con curvatura fuerte

Conclusión (2/2)

df_c:

  1. Correlación moderada (0.551)
  2. Forma elíptica clara
  3. Heatmap con patrón más suave y amplio
  4. QQ-plots alineados casi perfectamente con la curva teórica

La base que más se asemeja a una distribución normal multivariada es df_c

Muchas Gracias

Muchas Gracias